home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / quake.zip / HIPGRAPL.ZIP / HIPARMA.QC < prev    next >
Text File  |  1997-01-23  |  35KB  |  956 lines

  1. /*
  2. ==============================================================================
  3.  
  4. armagon
  5.  
  6. ==============================================================================
  7. */
  8.  
  9.  
  10. $cd hipwork\models\armagon
  11. $origin 0 0 24
  12. $base bodybase.asc
  13.  
  14. $skin armab
  15.  
  16. $frame lwalk1.asc lwalk2.asc lwalk3.asc lwalk4.asc lwalk5.asc lwalk6.asc lwalk7.asc
  17. $frame lwalk8.asc lwalk9.asc lwalk10.asc lwalk11.asc lwalk12.asc 
  18.  
  19. $frame lw0fir1.asc lw0fir2.asc lw0fir3.asc lw0fir4.asc lw0fir5.asc lw0fir6.asc
  20. $frame lw0fir7.asc lw0fir8.asc lw0fir9.asc lw0fir10.asc lw0fir11.asc lw0fir12.asc
  21. $frame lw0fir13.asc
  22.  
  23. $frame lw1fir1.asc lw1fir2.asc lw1fir3.asc lw1fir4.asc lw1fir5.asc lw1fir6.asc
  24. $frame lw1fir7.asc lw1fir8.asc lw1fir9.asc lw1fir10.asc lw1fir11.asc lw1fir12.asc 
  25. $frame lw1fir13.asc lw1fir14.asc lw1fir15.asc
  26.  
  27. $frame lw2fir1.asc lw2fir2.asc lw2fir3.asc lw2fir4.asc lw2fir5.asc lw2fir6.asc
  28. $frame lw2fir7.asc lw2fir8.asc lw2fir9.asc lw2fir10.asc lw2fir11.asc lw2fir12.asc 
  29.  
  30. $frame lsfire1.asc lsfire2.asc lsfire3.asc lsfire4.asc lsfire5.asc lsfire6.asc
  31. $frame lsfire7.asc lsfire8.asc lsfire9.asc lsfire10.asc lsfire11.asc lsfire12.asc 
  32.  
  33. $frame lstand1.asc lstand2.asc lstand3.asc lstand4.asc lstand5.asc lstand6.asc
  34. $frame lstand7.asc lstand8.asc lstand9.asc lstand10.asc lstand11.asc lstand12.asc
  35. $frame lstand13.asc lstand14.asc lstand15.asc lstand16.asc lstand17.asc
  36. $frame lstand18.asc lstand19.asc lstand20.asc
  37.  
  38. $frame tranl1.asc tranl2.asc
  39.  
  40. $frame ldie1.asc ldie2.asc ldie3.asc ldie4.asc ldie5.asc ldie6.asc
  41. $frame ldie7.asc ldie8.asc ldie9.asc ldie10.asc ldie11.asc ldie12.asc
  42.  
  43. float ATTN_ARMAGON = 0.5;
  44. float SERVO_VOLUME = 0.5;
  45.  
  46. void(float ofs, float turn) armagon_launch_missile =
  47.    {
  48.    local vector   src, vec, targ;
  49.    local vector   ang;
  50.    local entity   missile;
  51.    local float    dist;
  52.  
  53.    ang = self.angles;
  54.    ang_y = ang_y + self.fixangle;
  55.    if (turn==1)
  56.       {
  57.       ang_y = ang_y + 165;
  58.       }
  59.    else if (turn==2)
  60.       {
  61.       ang_y = ang_y - 165;
  62.       }
  63.    makevectors(ang);
  64.    src = self.origin + '0 0 66' + v_right*ofs + v_forward*84;
  65.    targ = self.enemy.origin + self.enemy.view_ofs;
  66.    if (skill!=0)
  67.       {
  68.       dist = vlen(targ-src);
  69.       targ = targ + (self.enemy.velocity * (dist/1000));
  70.       }
  71.    vec = (targ - src);
  72.    vec = normalize(vec);
  73.    dist = vec*v_forward;
  74.    if (dist<self.worldtype)
  75.       vec=v_forward;
  76.    self.effects = self.effects | EF_MUZZLEFLASH;
  77.  
  78.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  79.  
  80.     self.punchangle_x = -2;
  81.  
  82.     missile = spawn ();
  83.     missile.owner = self;
  84.     missile.movetype = MOVETYPE_FLYMISSILE;
  85.     missile.solid = SOLID_BBOX;
  86.     missile.classname = "missile";
  87.  
  88. // set missile speed
  89.    missile.velocity = vec * 1000;
  90.    missile.angles = vectoangles(vec);
  91.     missile.touch = T_MissileTouch;
  92.  
  93. // set missile duration
  94.     missile.nextthink = time + 5;
  95.     missile.think = SUB_Remove;
  96.  
  97.     setmodel (missile, "progs/missile.mdl");
  98.     setsize (missile, '0 0 0', '0 0 0');
  99.    setorigin (missile, src);
  100.    };
  101.  
  102. void(float ofs) armagon_launch_laser =
  103.    {
  104.    local vector   src, vec, targ;
  105.    local float    dist;
  106.    local vector   ang;
  107.  
  108.    ang = self.angles;
  109.    ang_y = ang_y + self.fixangle;
  110.    makevectors(ang);
  111.    src = self.origin + '0 0 66' + v_right*ofs + v_forward*84;
  112.    targ = self.enemy.origin + self.enemy.view_ofs;
  113.    if (skill!=0)
  114.       {
  115.       dist = vlen(targ-src);
  116.       targ = targ + (self.enemy.velocity * (dist/1000));
  117.       }
  118.    vec = (targ - src);
  119.    vec = normalize(vec);
  120.    dist = vec*v_forward;
  121.    if (dist<self.worldtype)
  122.       vec=v_forward;
  123.    self.effects = self.effects | EF_MUZZLEFLASH;
  124.  
  125.    HIP_LaunchLaser(src, vec, 0);
  126.    };
  127.  
  128. void(float angdelta, float delta) armagon_turn =
  129.    {
  130.    if (fabs(angdelta)<10)
  131.       self.fixangle = delta;
  132.    else
  133.       {
  134.       if (angdelta > 5)
  135.          {
  136.          self.fixangle = self.fixangle + 9;
  137.          }
  138.       else if (angdelta < -5)
  139.          {
  140.          self.fixangle = self.fixangle - 9;
  141.          }
  142.       else
  143.          {
  144.          self.fixangle = delta;
  145.          }
  146.       }
  147.    };
  148. void() armagon_overleft1;
  149. void() armagon_overright1;
  150.  
  151. void() armagon_think =
  152.    {
  153.    local float delta;
  154.    local float angdelta;
  155.    setorigin (self.trigger_field, self.origin);
  156.    self.trigger_field.angles = self.angles;
  157.    self.trigger_field.frame = self.frame;
  158.    self.trigger_field.angles_y = self.trigger_field.angles_y + self.fixangle;
  159.    enemy_yaw = vectoyaw(self.enemy.origin - self.origin);
  160.    self.ideal_yaw = enemy_yaw;
  161.    delta = self.ideal_yaw - self.angles_y;
  162.    self.cnt = 0;
  163.    if (delta > 180) delta = delta - 360;
  164.    if (delta < -180) delta = delta + 360;
  165.    if (fabs(delta) > 90)
  166.       {
  167.       delta = 0;
  168.       self.cnt = 1;
  169.       }
  170.    angdelta = delta-self.fixangle;
  171.    armagon_turn(angdelta,delta);
  172. //   self.nextthink = time + 0.1;
  173.    if (self.health < 0)
  174.       return;
  175.    if (time > self.super_time)
  176.       {
  177.       local float r;
  178.  
  179.       self.super_time = time + 3;
  180.       if (random() < 0.5)
  181.          {
  182.          r = random();
  183.          if (r < 0.25)
  184.             sound (self, CHAN_VOICE, "armagon/idle1.wav", 1, ATTN_ARMAGON);
  185.          else if (r < 0.5)
  186.             sound (self, CHAN_VOICE, "armagon/idle2.wav", 1, ATTN_ARMAGON);
  187.          else if (r < 0.75)
  188.             sound (self, CHAN_VOICE, "armagon/idle3.wav", 1, ATTN_ARMAGON);
  189.          else
  190.             sound (self, CHAN_VOICE, "armagon/idle4.wav", 1, ATTN_ARMAGON);
  191.          }
  192.       }
  193.    };
  194.  
  195. void() armagon_walkthink =
  196.    {
  197.    local float delta;
  198.    local float angdelta;
  199.    local entity client;
  200.    setorigin (self.trigger_field, self.origin);
  201.    self.trigger_field.angles = self.angles;
  202.    self.trigger_field.frame = self.frame;
  203.    self.trigger_field.angles_y = self.trigger_field.angles_y + self.fixangle;
  204.    ChangeYaw();
  205.    delta = 0;
  206.    self.cnt = 0;
  207.    if (delta > 180) delta = delta - 360;
  208.    if (delta < -180) delta = delta + 360;
  209.    if (fabs(delta) > 90)
  210.       {
  211.       delta = 0;
  212.       self.cnt = 1;
  213.       }
  214.    angdelta = delta-self.fixangle;
  215.    armagon_turn(angdelta,delta);
  216.    if (self.health < 0)
  217.       return;
  218.    if (time > self.super_time)
  219.       {
  220.       local float r;
  221.  
  222.       self.super_time = time + 3;
  223.       if (random() < 0.5)
  224.          {
  225.          r = random();
  226.          if (r < 0.25)
  227.             sound (self, CHAN_VOICE, "armagon/idle1.wav", 1, ATTN_ARMAGON);
  228.          else if (r < 0.5)
  229.             sound (self, CHAN_VOICE, "armagon/idle2.wav", 1, ATTN_ARMAGON);
  230.          else if (r < 0.75)
  231.             sound (self, CHAN_VOICE, "armagon/idle3.wav", 1, ATTN_ARMAGON);
  232.          else
  233.             sound (self, CHAN_VOICE, "armagon/idle4.wav", 1, ATTN_ARMAGON);
  234.          }
  235.       }
  236.    client = checkclient ();
  237.    if (!client)
  238.       return;  // current check entity isn't in PVS
  239.    if (visible(client))
  240.       {
  241.       self.enemy = client;
  242.       FoundTarget();
  243.       }
  244.    };
  245.  
  246. void() armagon_overleft_think =
  247.    {
  248.    local float delta;
  249.    local float angdelta;
  250.  
  251.    ChangeYaw();
  252.    walkmove (self.angles_y, 14);
  253.    setorigin (self.trigger_field, self.origin);
  254.    self.trigger_field.angles = self.angles;
  255.    self.trigger_field.frame = self.frame;
  256.    self.trigger_field.angles_y = self.trigger_field.angles_y + self.fixangle;
  257.    if (self.count == 0)
  258.       {
  259.       enemy_yaw = vectoyaw(self.enemy.origin - self.origin);
  260.       self.ideal_yaw = enemy_yaw;
  261.       delta = self.ideal_yaw - self.angles_y - 165;
  262.       if (delta > 180) delta = delta - 360;
  263.       if (delta < -180) delta = delta + 360;
  264.       angdelta = delta-self.fixangle;
  265.       }
  266.    else if (self.count == 1)
  267.       {
  268.       armagon_launch_missile(40,1);
  269.       return;
  270.       }
  271.    else
  272.       {
  273.       delta = 0;
  274.       angdelta = delta-self.fixangle;
  275.       }
  276.    armagon_turn(angdelta,delta);
  277. //   self.nextthink = time + 0.1;
  278.    };
  279.  
  280. void() armagon_overright_think =
  281.    {
  282.    local float delta;
  283.    local float angdelta;
  284.  
  285.    ChangeYaw();
  286.    walkmove (self.angles_y, 14);
  287.    setorigin (self.trigger_field, self.origin);
  288.    self.trigger_field.angles = self.angles;
  289.    self.trigger_field.frame = self.frame;
  290.    self.trigger_field.angles_y = self.trigger_field.angles_y + self.fixangle;
  291.    if (self.count == 0)
  292.       {
  293.       enemy_yaw = vectoyaw(self.enemy.origin - self.origin);
  294.       self.ideal_yaw = enemy_yaw;
  295.       delta = self.ideal_yaw - self.angles_y + 165;
  296.       if (delta > 180) delta = delta - 360;
  297.       if (delta < -180) delta = delta + 360;
  298.       angdelta = delta-self.fixangle;
  299.       }
  300.    else if (self.count == 1)
  301.       {
  302.       armagon_launch_missile(-40,2);
  303.       return;
  304.       }
  305.    else
  306.       {
  307.       delta = 0;
  308.       angdelta = delta-self.fixangle;
  309.       }
  310.    armagon_turn(angdelta,delta);
  311. //   self.nextthink = time + 0.1;
  312.    };
  313.  
  314. void() armagon_stand_attack;
  315.  
  316. void()   armagon_stand1  =[ $lstand1.asc, armagon_stand2  ] {ai_stand();armagon_think();self.nextthink = time + 0.2;};
  317. void()   armagon_stand2  =[ $lstand2.asc, armagon_stand3  ] {armagon_think();self.nextthink = time + 0.2;};
  318. void()   armagon_stand3  =[ $lstand3.asc, armagon_stand4  ] {armagon_think();self.nextthink = time + 0.2;};
  319. void()   armagon_stand4  =[ $lstand4.asc, armagon_stand5  ] {armagon_think();self.nextthink = time + 0.2;};
  320. void()   armagon_stand5  =[ $lstand5.asc, armagon_stand6  ] {armagon_think();self.nextthink = time + 0.2;};
  321. void()   armagon_stand6  =[ $lstand6.asc, armagon_stand7  ] {armagon_think();self.nextthink = time + 0.2;};
  322. void()   armagon_stand7  =[ $lstand7.asc, armagon_stand8  ] {armagon_think();self.nextthink = time + 0.2;};
  323. void()   armagon_stand8  =[ $lstand8.asc, armagon_stand9  ] {armagon_think();self.nextthink = time + 0.2;};
  324. void()   armagon_stand9  =[ $lstand9.asc, armagon_stand10  ] {armagon_think();self.nextthink = time + 0.2;};
  325. void()   armagon_stand10  =[ $lstand10.asc, armagon_stand11  ] {ai_stand();armagon_think();self.nextthink = time + 0.2;};
  326. void()   armagon_stand11  =[ $lstand11.asc, armagon_stand12  ] {armagon_think();self.nextthink = time + 0.2;};
  327. void()   armagon_stand12  =[ $lstand12.asc, armagon_stand13  ] {armagon_think();self.nextthink = time + 0.2;};
  328. void()   armagon_stand13  =[ $lstand13.asc, armagon_stand14  ] {armagon_think();self.nextthink = time + 0.2;};
  329. void()   armagon_stand14  =[ $lstand14.asc, armagon_stand15  ] {armagon_think();self.nextthink = time + 0.2;};
  330. void()   armagon_stand15  =[ $lstand15.asc, armagon_stand16  ] {armagon_think();self.nextthink = time + 0.2;};
  331. void()   armagon_stand16  =[ $lstand16.asc, armagon_stand17  ] {armagon_think();self.nextthink = time + 0.2;};
  332. void()   armagon_stand17  =[ $lstand17.asc, armagon_stand18  ] {armagon_think();self.nextthink = time + 0.2;};
  333. void()   armagon_stand18  =[ $lstand18.asc, armagon_stand19  ] {armagon_think();self.nextthink = time + 0.2;};
  334. void()   armagon_stand19  =[ $lstand19.asc, armagon_stand20  ] {armagon_think();self.nextthink = time + 0.2;};
  335. void()   armagon_stand20  =[ $lstand20.asc, armagon_stand1  ] {ai_stand();armagon_think();self.nextthink = time + 0.2;};
  336.  
  337. void()   armagon_walk1    =[ $lwalk1.asc  , armagon_walk2    ]
  338.    {
  339.    movetogoal(14);
  340.    armagon_walkthink();
  341.    };
  342. void()   armagon_walk2    =[ $lwalk2.asc  , armagon_walk3    ]
  343.    {
  344.    movetogoal(14);
  345.    armagon_walkthink();
  346.    };
  347. void()   armagon_walk3    =[ $lwalk3.asc  , armagon_walk4    ]
  348.    {
  349.    sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);
  350.    movetogoal(14);
  351.    armagon_walkthink();
  352.    };
  353. void()   armagon_walk4    =[ $lwalk4.asc  , armagon_walk5    ]
  354.    {
  355.    movetogoal(14);
  356.    armagon_walkthink();
  357.    };
  358. void()   armagon_walk5    =[ $lwalk5.asc  , armagon_walk6    ]
  359.    {
  360.    sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);
  361.    movetogoal(14);
  362.    armagon_walkthink();
  363.    };
  364. void()   armagon_walk6    =[ $lwalk6.asc  , armagon_walk7    ]
  365.    {
  366.    movetogoal(14);
  367.    armagon_walkthink();
  368.    };
  369. void()   armagon_walk7    =[ $lwalk7.asc  , armagon_walk8    ]
  370.    {
  371.    movetogoal(14);
  372.    armagon_walkthink();
  373.    };
  374. void()   armagon_walk8    =[ $lwalk8.asc  , armagon_walk9    ]
  375.    {
  376.    movetogoal(14);
  377.    armagon_walkthink();
  378.    };
  379. void()   armagon_walk9    =[ $lwalk9.asc  , armagon_walk10    ]
  380.    {
  381.    sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);
  382.    movetogoal(14);
  383.    armagon_walkthink();
  384.    };
  385. void()   armagon_walk10    =[ $lwalk10.asc  , armagon_walk11    ]
  386.    {
  387.    movetogoal(14);
  388.    armagon_walkthink();
  389.    };
  390. void()   armagon_walk11    =[ $lwalk11.asc  , armagon_walk12    ]
  391.    {
  392.    sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);
  393.    movetogoal(14);
  394.    armagon_walkthink();
  395.    };
  396. void()   armagon_walk12    =[ $lwalk12.asc  , armagon_walk1    ]
  397.    {
  398.    movetogoal(14);
  399.    armagon_walkthink();
  400.    };
  401.  
  402. void()   armagon_run1    =[ $lwalk1.asc  , armagon_run2    ]
  403.    {
  404.    ChangeYaw();
  405.    RUN_STRAIGHT = 1;
  406.    ai_run(14);
  407.    armagon_think();
  408.    };
  409. void()   armagon_run2    =[ $lwalk2.asc  , armagon_run3    ]
  410.    {
  411.    ChangeYaw();
  412.    RUN_STRAIGHT = 1;
  413.    ai_run(14);
  414.    armagon_think();
  415.    };
  416. void()   armagon_run3    =[ $lwalk3.asc  , armagon_run4    ]
  417.    {
  418.    sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);
  419.    ChangeYaw();
  420.    RUN_STRAIGHT = 1;
  421.    ai_run(14);
  422.    armagon_think();
  423.    };
  424. void()   armagon_run4    =[ $lwalk4.asc  , armagon_run5    ]
  425.    {
  426.    ChangeYaw();
  427.    RUN_STRAIGHT = 1;
  428.    ai_run(14);
  429.    armagon_think();
  430.    };
  431. void()   armagon_run5    =[ $lwalk5.asc  , armagon_run6    ]
  432.    {
  433.    sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);
  434.    ChangeYaw();
  435.    RUN_STRAIGHT = 1;
  436.    ai_run(14);
  437.    armagon_think();
  438.    };
  439. void()   armagon_run6    =[ $lwalk6.asc  , armagon_run7    ]
  440.    {
  441.    ChangeYaw();
  442.    RUN_STRAIGHT = 1;
  443.    ai_run(14);
  444.    armagon_think();
  445.    };
  446. void()   armagon_run7    =[ $lwalk7.asc  , armagon_run8    ]
  447.    {
  448.    ChangeYaw();
  449.    RUN_STRAIGHT = 1;
  450.    ai_run(14);
  451.    armagon_think();
  452.    };
  453. void()   armagon_run8    =[ $lwalk8.asc  , armagon_run9    ]
  454.    {
  455.    ChangeYaw();
  456.    RUN_STRAIGHT = 1;
  457.    ai_run(14);
  458.    armagon_think();
  459.    };
  460. void()   armagon_run9    =[ $lwalk9.asc  , armagon_run10    ]
  461.    {
  462.    sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);
  463.    ChangeYaw();
  464.    RUN_STRAIGHT = 1;
  465.    ai_run(14);
  466.    armagon_think();
  467.    };
  468. void()   armagon_run10    =[ $lwalk10.asc  , armagon_run11    ]
  469.    {
  470.    ChangeYaw();
  471.    RUN_STRAIGHT = 1;
  472.    ai_run(14);
  473.    armagon_think();
  474.    };
  475. void()   armagon_run11    =[ $lwalk11.asc  , armagon_run12    ]
  476.    {
  477.    sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);
  478.    ChangeYaw();
  479.    RUN_STRAIGHT = 1;
  480.    ai_run(14);
  481.    armagon_think();
  482.    };
  483. void()   armagon_run12    =[ $lwalk12.asc  , armagon_run1    ]
  484.    {
  485.    ChangeYaw();
  486.    RUN_STRAIGHT = 1;
  487.    ai_run(14);
  488.    armagon_think();
  489.    if ((self.cnt == 1) && (time > self.attack_finished))
  490.       {
  491.       local float delta;
  492.       delta = self.ideal_yaw - self.angles_y;
  493.       if (delta > 180) delta = delta - 360;
  494.       if (delta < -180) delta = delta + 360;
  495.       if (delta>0)
  496.          self.think = armagon_overleft1;
  497.       else
  498.          self.think = armagon_overright1;
  499.       return;
  500.       }
  501.    if (self.lefty == 1)
  502.       {
  503.       self.lefty = 0;
  504.       self.think = self.th_missile;
  505.       }
  506.    };
  507.  
  508. void()   armagon_watk1    =[ $lw0fir1.asc, armagon_watk2  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  509. void()   armagon_watk2    =[ $lw0fir2.asc, armagon_watk3  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  510. void()   armagon_watk3    =[ $lw0fir3.asc, armagon_watk4  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  511. void()   armagon_watk4    =[ $lw0fir4.asc, armagon_watk5  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  512. void()   armagon_watk5    =[ $lw0fir5.asc, armagon_watk6  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  513. void()   armagon_watk6    =[ $lw0fir6.asc, armagon_watk7  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();armagon_launch_missile(40,0);};
  514. void()   armagon_watk7    =[ $lw0fir7.asc, armagon_watk8  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  515. void()   armagon_watk8    =[ $lw0fir8.asc, armagon_watk9  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  516. void()   armagon_watk9    =[ $lw0fir9.asc, armagon_watk10  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  517. void()   armagon_watk10    =[ $lw0fir10.asc, armagon_watk11  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  518. void()   armagon_watk11    =[ $lw0fir11.asc, armagon_watk13  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();armagon_launch_missile(-40,0);};
  519. //void()   armagon_watk12    =[ $lw0fir12.asc, armagon_watk13  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  520. void()   armagon_watk13    =[ $lw0fir12.asc, armagon_run1  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();SUB_AttackFinished (1.0);};
  521.  
  522. void()   armagon_wlaseratk1    =[ $lw0fir1.asc, armagon_wlaseratk2  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  523. void()   armagon_wlaseratk2    =[ $lw0fir2.asc, armagon_wlaseratk3  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  524. void()   armagon_wlaseratk3    =[ $lw0fir3.asc, armagon_wlaseratk4  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  525. void()   armagon_wlaseratk4    =[ $lw0fir4.asc, armagon_wlaseratk5  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  526. void()   armagon_wlaseratk5    =[ $lw0fir5.asc, armagon_wlaseratk6  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  527. void()   armagon_wlaseratk6    =[ $lw0fir6.asc, armagon_wlaseratk7  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();armagon_launch_laser(40);};
  528. void()   armagon_wlaseratk7    =[ $lw0fir7.asc, armagon_wlaseratk8  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  529. void()   armagon_wlaseratk8    =[ $lw0fir8.asc, armagon_wlaseratk9  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  530. void()   armagon_wlaseratk9    =[ $lw0fir9.asc, armagon_wlaseratk10  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  531. void()   armagon_wlaseratk10    =[ $lw0fir10.asc, armagon_wlaseratk11  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  532. void()   armagon_wlaseratk11    =[ $lw0fir11.asc, armagon_wlaseratk13  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();armagon_launch_laser(-40);};
  533. //void()   armagon_wlaseratk12    =[ $lw0fir12.asc, armagon_wlaseratk13  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();};
  534. void()   armagon_wlaseratk13    =[ $lw0fir12.asc, armagon_run1  ] {ChangeYaw();walkmove (self.angles_y, 14);armagon_think();SUB_AttackFinished (1.0);};
  535.  
  536. void()   armagon_overleft1    =[ $lw1fir1.asc, armagon_overleft2  ] {self.count=0;armagon_overleft_think();};
  537. void()   armagon_overleft2    =[ $lw1fir2.asc, armagon_overleft3  ] {armagon_overleft_think();};
  538. void()   armagon_overleft3    =[ $lw1fir3.asc, armagon_overleft4  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);armagon_overleft_think();};
  539. void()   armagon_overleft4    =[ $lw1fir4.asc, armagon_overleft5  ] {armagon_overleft_think();};
  540. void()   armagon_overleft5    =[ $lw1fir5.asc, armagon_overleft6  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);armagon_overleft_think();};
  541. void()   armagon_overleft6    =[ $lw1fir6.asc, armagon_overleft7  ] {armagon_overleft_think();};
  542. void()   armagon_overleft7    =[ $lw1fir7.asc, armagon_overleft8  ] {armagon_overleft_think();};
  543. void()   armagon_overleft8    =[ $lw1fir8.asc, armagon_overleft9  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);armagon_overleft_think();};
  544. void()   armagon_overleft9    =[ $lw1fir9.asc, armagon_overleft10  ] {armagon_overleft_think();};
  545. void()   armagon_overleft10    =[ $lw1fir10.asc, armagon_overleft11  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);armagon_overleft_think();};
  546. void()   armagon_overleft11    =[ $lw1fir11.asc, armagon_overleft12  ] {self.count=1;armagon_overleft_think();};
  547. void()   armagon_overleft12    =[ $lw1fir12.asc, armagon_overleft13  ] {self.count=2;armagon_overleft_think();};
  548. void()   armagon_overleft13    =[ $lw1fir13.asc, armagon_overleft14  ] {armagon_overleft_think();};
  549. void()   armagon_overleft14    =[ $lw1fir14.asc, armagon_overleft15  ] {armagon_overleft_think();};
  550. void()   armagon_overleft15    =[ $lw1fir15.asc, armagon_run1  ] {armagon_overleft_think();SUB_AttackFinished (1.0);};
  551.  
  552. void()   armagon_overright1    =[ $lw2fir1.asc, armagon_overright2  ] {self.count=0;armagon_overright_think();};
  553. void()   armagon_overright2    =[ $lw2fir2.asc, armagon_overright3  ] {armagon_overright_think();};
  554. void()   armagon_overright3    =[ $lw2fir3.asc, armagon_overright4  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);armagon_overright_think();};
  555. void()   armagon_overright4    =[ $lw2fir4.asc, armagon_overright5  ] {armagon_overright_think();};
  556. void()   armagon_overright5    =[ $lw2fir5.asc, armagon_overright6  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);self.count=1;armagon_overright_think();};
  557. void()   armagon_overright6    =[ $lw2fir6.asc, armagon_overright7  ] {self.count=2;armagon_overright_think();};
  558. void()   armagon_overright7    =[ $lw2fir7.asc, armagon_overright8  ] {armagon_overright_think();};
  559. void()   armagon_overright8    =[ $lw2fir8.asc, armagon_overright9  ] {sound (self, 7, "armagon/servo.wav", SERVO_VOLUME, ATTN_ARMAGON);armagon_overright_think();};
  560. void()   armagon_overright9    =[ $lw2fir9.asc, armagon_overright10  ] {armagon_overright_think();};
  561. void()   armagon_overright10    =[ $lw2fir10.asc, armagon_overright11  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);armagon_overright_think();};
  562. void()   armagon_overright11    =[ $lw2fir11.asc, armagon_overright12  ] {armagon_overright_think();};
  563. void()   armagon_overright12    =[ $lw2fir12.asc, armagon_run1  ] {armagon_overright_think();SUB_AttackFinished (1.0);};
  564.  
  565. void()   armagon_plant1  =[ $lstand1.asc, armagon_plant1  ] {armagon_stand_attack();armagon_think();};
  566.  
  567. void()   armagon_stop1  =[ $tranl1.asc, armagon_stop2  ] {armagon_think();};
  568. void()   armagon_stop2  =[ $tranl2.asc, armagon_plant1  ] {sound (self, 6, "armagon/footfall.wav",1,ATTN_ARMAGON);armagon_think();};
  569.  
  570.  
  571.  
  572. void()   armagon_satk1    =[ $lsfire1.asc, armagon_satk2  ] {armagon_think();};
  573. void()   armagon_satk2    =[ $lsfire2.asc, armagon_satk3  ] {armagon_think();};
  574. void()   armagon_satk3    =[ $lsfire3.asc, armagon_satk4  ] {armagon_think();};
  575. void()   armagon_satk4    =[ $lsfire4.asc, armagon_satk5  ] {armagon_think();};
  576. void()   armagon_satk5    =[ $lsfire5.asc, armagon_satk6  ] {armagon_think();};
  577. void()   armagon_satk6    =[ $lsfire6.asc, armagon_satk7  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);armagon_think();};
  578. void()   armagon_satk7    =[ $lsfire7.asc, armagon_satk8  ] {armagon_think();};
  579. void()   armagon_satk8    =[ $lsfire8.asc, armagon_satk9  ] {armagon_think();};
  580. void()   armagon_satk9    =[ $lsfire9.asc, armagon_satk10 ] {armagon_think();armagon_launch_missile(40,0);armagon_launch_missile(-40,0);};
  581. void()   armagon_satk10   =[ $lsfire10.asc, armagon_satk11 ] {armagon_think();};
  582. void()   armagon_satk11   =[ $lsfire9.asc, armagon_satk12 ] {armagon_think();armagon_launch_missile(40,0);armagon_launch_missile(-40,0);};
  583. void()   armagon_satk12   =[ $lsfire10.asc, armagon_satk13 ] {armagon_think();};
  584. void()   armagon_satk13   =[ $lsfire9.asc, armagon_satk14 ] {armagon_think();armagon_launch_missile(40,0);armagon_launch_missile(-40,0);};
  585. void()   armagon_satk14   =[ $lsfire10.asc, armagon_satk15 ] {armagon_think();};
  586. void()   armagon_satk15   =[ $lsfire11.asc, armagon_satk16 ] {armagon_think();};
  587. void()   armagon_satk16   =[ $lsfire12.asc, armagon_plant1   ] {armagon_think();SUB_AttackFinished (0.3);};
  588.  
  589. void()   armagon_slaser1    =[ $lsfire1.asc, armagon_slaser2  ] {armagon_think();};
  590. void()   armagon_slaser2    =[ $lsfire2.asc, armagon_slaser3  ] {armagon_think();};
  591. void()   armagon_slaser3    =[ $lsfire3.asc, armagon_slaser4  ] {armagon_think();};
  592. void()   armagon_slaser4    =[ $lsfire4.asc, armagon_slaser5  ] {armagon_think();};
  593. void()   armagon_slaser5    =[ $lsfire5.asc, armagon_slaser6  ] {armagon_think();};
  594. void()   armagon_slaser6    =[ $lsfire6.asc, armagon_slaser7  ] {sound (self, 6, "armagon/footfall.wav", 1, ATTN_ARMAGON);armagon_think();};
  595. void()   armagon_slaser7    =[ $lsfire7.asc, armagon_slaser8  ] {armagon_think();};
  596. void()   armagon_slaser8    =[ $lsfire8.asc, armagon_slaser9  ] {armagon_think();};
  597. void()   armagon_slaser9    =[ $lsfire9.asc, armagon_slaser10 ] {armagon_think();armagon_launch_laser(40);armagon_launch_laser(-40);};
  598. void()   armagon_slaser10   =[ $lsfire10.asc, armagon_slaser11 ] {armagon_think();};
  599. void()   armagon_slaser11    =[ $lsfire9.asc, armagon_slaser12 ] {armagon_think();armagon_launch_laser(40);armagon_launch_laser(-40);};
  600. void()   armagon_slaser12   =[ $lsfire10.asc, armagon_slaser13 ] {armagon_think();};
  601. void()   armagon_slaser13    =[ $lsfire9.asc, armagon_slaser14 ] {armagon_think();armagon_launch_laser(40);armagon_launch_laser(-40);};
  602. void()   armagon_slaser14   =[ $lsfire10.asc, armagon_slaser15 ] {armagon_think();};
  603. void()   armagon_slaser15    =[ $lsfire9.asc, armagon_slaser16 ] {armagon_think();armagon_launch_laser(40);armagon_launch_laser(-40);};
  604. void()   armagon_slaser16   =[ $lsfire10.asc, armagon_slaser17 ] {armagon_think();};
  605. void()   armagon_slaser17    =[ $lsfire9.asc, armagon_slaser18 ] {armagon_think();armagon_launch_laser(40);armagon_launch_laser(-40);};
  606. void()   armagon_slaser18   =[ $lsfire10.asc, armagon_slaser19 ] {armagon_think();};
  607. void()   armagon_slaser19   =[ $lsfire11.asc, armagon_slaser20 ] {armagon_think();};
  608. void()   armagon_slaser20   =[ $lsfire12.asc, armagon_plant1   ] {armagon_think();SUB_AttackFinished (0.3);};
  609.  
  610. void()   armagon_body_explode1;
  611.  
  612. void()   armagon_die1    =[ $tranl1.asc, armagon_die2    ] {armagon_think();self.nextthink = time + 0.2;};
  613. void()   armagon_die2    =[ $tranl2.asc, armagon_die3    ] {armagon_think();self.nextthink = time + 0.2;};
  614. void()   armagon_die3    =[ $ldie1.asc, armagon_die4    ] {armagon_think();self.nextthink = time + 0.2;};
  615. void()   armagon_die4    =[ $ldie2.asc, armagon_die5    ]
  616.    {
  617.    armagon_think();
  618.    multi_explosion( self.origin + '0 0 48', 48, 10, 6, 0.3, 0.3);
  619.    sound (self, CHAN_AUTO, "armagon/death.wav", 1, ATTN_NONE);
  620.    self.nextthink = time + 0.2;
  621.    };
  622. void()   armagon_die5    =[ $ldie3.asc, armagon_die6    ] {armagon_think();self.nextthink = time + 0.2;};
  623. void()   armagon_die6    =[ $ldie4.asc, armagon_die7    ] {armagon_think();self.nextthink = time + 0.2;};
  624. void()   armagon_die7    =[ $ldie5.asc, armagon_die8    ] {armagon_think();self.nextthink = time + 0.2;};
  625. void()   armagon_die8    =[ $ldie6.asc, armagon_die9    ]
  626.    {
  627.    armagon_think();
  628.    self.nextthink = time + 2;
  629.    };
  630. void()   armagon_die9    =[ $ldie7.asc, armagon_die10    ] {armagon_think();self.nextthink = time + 0.2;};
  631. void()   armagon_die10    =[ $ldie8.asc, armagon_die11    ] {armagon_think();self.nextthink = time + 0.2;};
  632. void()   armagon_die11    =[ $ldie9.asc, armagon_die12    ] {armagon_think();self.nextthink = time + 0.2;};
  633. void()   armagon_die12    =[ $ldie10.asc, armagon_die13    ] {armagon_think();self.nextthink = time + 0.2;};
  634. void()   armagon_die13    =[ $ldie11.asc, armagon_die14    ] {armagon_think();self.nextthink = time + 0.2;};
  635. void()   armagon_die14    =[ $ldie12.asc, armagon_die14    ]
  636.    {
  637.    local entity body;
  638.  
  639.    armagon_think();
  640.    multi_explosion( self.origin + '0 0 80', 20, 10, 3, 0.1, 0.5);
  641.    // legs
  642.    self.nextthink = -1;
  643.    self.movetype = MOVETYPE_NONE;
  644.     self.takedamage = DAMAGE_NO;
  645.    self.solid = SOLID_NOT;
  646.    setsize (self, '-32 -32 -24', '32 32 32' );
  647.    self.flags = 0;
  648.    self.gorging = TRUE;
  649.    self.wait = time + 5;
  650.  
  651.    //body
  652.    body = self.trigger_field;
  653.    body.nextthink = -1;
  654.    self.movetype = MOVETYPE_NONE;
  655.    body.takedamage = DAMAGE_NO;
  656.    body.solid = SOLID_NOT;
  657. //   setsize (body, '-32 -32 30', '32 32 64' );
  658.    body.think = armagon_body_explode1;
  659.    body.nextthink = time + 0.1;
  660.    body.gorging = TRUE;
  661.    };
  662.  
  663. void()   armagon_body_explode2 =
  664.    {
  665.    local entity expl;
  666.  
  667.    sound (self , CHAN_AUTO, "misc/longexpl.wav", 1, ATTN_ARMAGON);
  668.    self.think = armagon_body_explode2;
  669.    ThrowGib ("progs/gib1.mdl", -200);
  670.    ThrowGib ("progs/gib2.mdl", -200);
  671.    ThrowGib ("progs/gib3.mdl", -200);
  672.    ThrowGib ("progs/gib1.mdl", -200);
  673.    ThrowGib ("progs/gib2.mdl", -200);
  674.    ThrowGib ("progs/gib3.mdl", -200);
  675.    ThrowGib ("progs/gib1.mdl", -200);
  676.    ThrowGib ("progs/gib2.mdl", -200);
  677.    ThrowGib ("progs/gib3.mdl", -200);
  678.    self.movetype = MOVETYPE_NONE;
  679.    setmodel (self, "progs/s_explod.spr");
  680.    self.solid = SOLID_NOT;
  681.    self.nextthink = time + 0.1;
  682.    s_explode1 ();
  683.    };
  684.  
  685. void()   armagon_body_explode1 =
  686.    {
  687.  
  688.    self.think = armagon_body_explode1;
  689.    self.nextthink = time + 0.1;
  690.    if (self.cnt == 0)
  691.       {
  692.       self.count = 0;
  693.       }
  694.    if (self.cnt < 25)
  695.       {
  696.       if (self.cnt > self.count)
  697.          {
  698.          ThrowGib ("progs/gib1.mdl", -100);
  699.          ThrowGib ("progs/gib2.mdl", -100);
  700.          ThrowGib ("progs/gib3.mdl", -100);
  701.          self.count = self.cnt + 1;
  702.          }
  703.       self.cnt = self.cnt + 1;
  704.       }
  705.    else
  706.       {
  707.       self.cnt = 0;
  708.       self.think = armagon_body_explode2;
  709.       }
  710.    };
  711.  
  712. void(entity attacker, float damage) armagon_pain =
  713.    {
  714.    if (self.health <= 0)
  715.         return;        // allready dying, don't go into pain frame
  716.  
  717.    if (damage < 25)
  718.       return;
  719.     if (self.pain_finished > time)
  720.         return;
  721.     self.pain_finished = time + 2;
  722.  
  723.    sound (self, CHAN_VOICE, "armagon/pain.wav", 1, ATTN_NORM);
  724.    };
  725.  
  726.  
  727.  
  728. void() armagon_missile_attack =
  729.    {
  730.    if (random()<0.5)
  731.       armagon_watk1();
  732.    else
  733.       armagon_wlaseratk1();
  734. //   self.nextthink = time + 0.1;
  735.    };
  736.  
  737. void() armagon_repulse_attack =
  738.    {
  739.    armagon_think();
  740.    if (self.state == 0)
  741.       {
  742.       SUB_AttackFinished (0.5);
  743.       sound (self, CHAN_BODY, "armagon/repel.wav", 1, ATTN_NORM);
  744.       self.state = 1;
  745.       return;
  746.       }
  747.    else if (self.state == 1)
  748.       {
  749.       local entity head;
  750.       local vector dir;
  751.  
  752.       // look in our immediate vicinity
  753.       head = findradius(self.origin, 300);
  754.       while(head)
  755.          {
  756.          if(!(head.flags & FL_NOTARGET) && (head.flags & FL_CLIENT))
  757.             {
  758.             if (visible(head) && (head.health > 0))
  759.                {
  760.                dir = head.origin - (self.origin - '0 0 24');
  761.                dir = normalize(dir);
  762.                head.velocity = head.velocity + dir*1500;
  763.                }
  764.             }
  765.          head = head.chain;
  766.          }
  767.       T_RadiusDamage (self, self, 60, self);
  768.       self.state = 0;
  769.       SUB_AttackFinished (0.1);
  770.       }
  771. //   self.nextthink = time + 0.1;
  772.    };
  773.  
  774. void() armagon_stand_attack =
  775.    {
  776.    local vector   spot1, spot2;
  777.  
  778. // see if any entities are in the way of the shot
  779.    spot1 = self.origin + self.view_ofs;
  780.    spot2 = self.enemy.origin + self.enemy.view_ofs;
  781.  
  782.    traceline (spot1, spot2, FALSE, self);
  783.  
  784.    if (trace_ent != self.enemy)
  785.       {
  786.       armagon_run1();
  787.       return;
  788.       }
  789.  
  790.     if (trace_inopen && trace_inwater)
  791.       {
  792.       armagon_run1();
  793.       return;
  794.       }
  795.  
  796.    if (time < self.attack_finished)
  797.       {
  798.       return;
  799.       }
  800.  
  801.    if ((vlen(spot2-spot1) < 200) && (self.enemy.classname == "player"))
  802.       {
  803.       armagon_repulse_attack();
  804.       return;
  805.       }
  806.  
  807.    self.state = 0;
  808.  
  809.    if (vlen(spot2-spot1) > 450)
  810.       {
  811.       armagon_run1();
  812.       return;
  813.       }
  814.  
  815.    if (random()<0.5)
  816.       armagon_satk1();
  817.    else
  818.       armagon_slaser1();
  819.  
  820.    if (self.cnt == 1)
  821.       {
  822.       armagon_run1();
  823.       return;
  824.       }
  825.    };
  826.  
  827.  
  828. float()  ArmagonCheckAttack =
  829.    {
  830.     local vector    spot1, spot2;
  831.     local entity    targ;
  832.    local float    ang;
  833.    local float    delta;
  834.    local float    dist;
  835.  
  836.    self.lefty = 0;
  837.  
  838.     targ = self.enemy;
  839.  
  840. // see if any entities are in the way of the shot
  841.    spot1 = self.origin + self.view_ofs;
  842.     spot2 = targ.origin + targ.view_ofs;
  843.  
  844.     traceline (spot1, spot2, FALSE, self);
  845.  
  846.    if ((trace_ent != targ) && (!self.charmed))
  847.       return FALSE;     // don't have a clear shot
  848.  
  849.     if (trace_inopen && trace_inwater)
  850.         return FALSE;            // sight line crossed contents
  851.  
  852.    if (time < self.attack_finished)
  853.         return FALSE;
  854.  
  855.    ang = self.angles_y + self.fixangle;
  856.    delta = self.ideal_yaw - ang;
  857.    dist = vlen(spot2-spot1);
  858.    if ((fabs(delta) > 10 && (dist > 200)) || (self.enemy.classname != "player"))
  859.       return FALSE;
  860.    if (dist < 400)
  861.       {  // melee attack
  862.       self.th_melee ();
  863.       return TRUE;
  864.         }
  865. // missile attack
  866.    self.lefty = 1;
  867. //   self.th_missile ();
  868. //   SUB_AttackFinished (1.5*random());
  869.    return FALSE;
  870.    };
  871.  
  872.  
  873. /*QUAKED monster_armagon (1 0 0) (-32 -32 -24) (32 32 64) Ambush
  874. */
  875. void() monster_armagon =
  876. {
  877.    local entity body;
  878.    local float sk;
  879.    if (deathmatch)
  880.     {
  881.         remove(self);
  882.         return;
  883.     }
  884.  
  885.    self.lefty = 0;
  886.  
  887.    sk = cvar("skill");
  888.  
  889.    precache_model ("progs/armabody.mdl");
  890.    precache_model ("progs/armalegs.mdl");
  891.  
  892.    precache_sound ("armagon/footfall.wav");
  893.    precache_sound ("armagon/servo.wav");
  894. //   precache_sound ("armagon/footfall2.wav");
  895.    precache_sound ("armagon/death.wav");
  896. //   precache_sound ("armagon/death2.wav");
  897.    precache_sound ("armagon/pain.wav");
  898.    precache_sound ("armagon/repel.wav");
  899. //   precache_sound ("armagon/idle.wav");
  900.    precache_sound ("armagon/sight.wav");
  901.    precache_sound ("armagon/idle1.wav");
  902.    precache_sound ("armagon/idle2.wav");
  903.    precache_sound ("armagon/idle3.wav");
  904.    precache_sound ("armagon/idle4.wav");
  905.  
  906.    body = spawn();
  907.    body.origin = self.origin;
  908.    body.origin = body.origin - '0 0 64';
  909. //  SUB_CopyEntity(self,body);
  910.  
  911.    self.solid = SOLID_SLIDEBOX;
  912.    self.fixangle = 0;
  913.     self.movetype = MOVETYPE_STEP;
  914.    body.solid = SOLID_NOT;
  915.    body.movetype = MOVETYPE_STEP;
  916.    self.trigger_field = body;
  917.    body.trigger_field = self;
  918.  
  919.    setmodel (body, "progs/armabody.mdl");
  920.    setmodel (self, "progs/armalegs.mdl");
  921.  
  922.    setsize (self, '-48 -48 -24', '48 48 84' );
  923.    setorigin (self, self.origin);
  924.    setorigin (body, body.origin);
  925.    if (sk==0)
  926.       {
  927.       self.yaw_speed = 5;
  928.       self.health = 2000;
  929.       self.worldtype = 0.9;
  930.       }
  931.    else if (sk==1)
  932.       {
  933.       self.yaw_speed = 9;
  934.       self.health = 2500;
  935.       self.worldtype = 0.85;
  936.       }
  937.    else
  938.       {
  939.       self.yaw_speed = 12;
  940.       self.health = 3500;
  941.       self.worldtype = 0.75;
  942.       }
  943.    self.state = 0;
  944.    self.super_time = 0;
  945.    self.endtime = 0;
  946.  
  947.    self.th_stand = armagon_stand1;
  948.    self.th_walk = armagon_walk1;
  949.    self.th_run = armagon_run1;
  950.    self.th_die = armagon_die1;
  951.    self.th_missile = armagon_missile_attack;
  952.    self.th_melee = armagon_stop1;
  953.    self.th_pain = armagon_pain;
  954.    walkmonster_start();
  955. };
  956.